/*
 * @Date: 2024-10-29 16:59:21
 * @Author: LiSong
 * @LastEditors: LiSong
 * @LastEditTime: 2024-11-06 09:45:48
 * @Description: 表格格式类
 */
import { PojoUtils } from '../cfg/PojoUtils'


const dateFormatOptions = [
  { label: 'yyyy-MM-dd', value: 'yyyy-MM-dd' },
	{ label: 'yyyy/MM/dd', value: 'yyyy/MM/dd' },
	{ label: 'yyyy年MM月dd日', value: 'yyyy年MM月dd日' },
	{ label: 'yyyy/MM/dd HH:mm', value: 'yyyy/MM/dd HH:mm' },
	{ label: 'yyyy-MM-dd HH:mm', value: 'yyyy-MM-dd HH:mm' },
	{ label: 'yyyy/MM/dd hh:mm', value: 'yyyy/MM/dd hh:mm' },
	{ label: 'yyyy-MM-dd hh:mm', value: 'yyyy-MM-dd hh:mm' },
	{ label: 'yyyy/MM/dd HH:mm:ss', value: 'yyyy/MM/dd HH:mm:ss' },
	{ label: 'yyyy-MM-dd HH:mm:ss', value: 'yyyy-MM-dd HH:mm:ss' },
	{ label: 'yyyy/MM/dd HH:mm:ss', value: 'yyyy/MM/dd hh:mm:ss' },
	{ label: 'yyyy-MM-dd HH:mm:ss', value: 'yyyy-MM-dd hh:mm:ss' },
	{ label: 'yyyy年MM月dd日 HH时mm分', value: 'yyyy年MM月dd日 HH时mm分' },
	{ label: 'yyyy年MM月dd日 hh时mm分', value: 'yyyy年hh月dd日 HH时mm分' },
	{ label: 'yyyy年MM月dd日 HH时mm分ss秒', value: 'yyyy年MM月dd日 HH时mm分ss秒' },
	{ label: 'yyyy年MM月dd日 hh时mm分ss秒', value: 'yyyy年MM月dd日 hh时mm分ss秒' },
]
const stringFormatOptions = [
]
const numberFormatOptions = [
  { label: '千分位，不保留小数', value: '000,000,000,000.######', remark: '不保留小数' },
	{ label: '千分位，保留两位小数', value: '000,000,000,000.00####', remark: '保留两位小数' },
	{ label: '千分位，保留四位小数', value: '000,000,000,000.0000##', remark: '保留四位小数' },
	{ label: '千分位，保留六位小数', value: '000,000,000,000.000000', remark: '保留六位小数' },
]
const accountFormatOptions = [
  {
    label: '银行卡号', value: 'bank-card', remark: '银行卡号格式化', regExp: /(\d{4})(?=\d)/g,
    formatValue: (value) => {
      return value.replace(/(\d{4})(?=\d)/g, "$1 ")
    }
  },
]

/**
 * 格式化分类定义
 */
export class TableDataType {
  constructor (label, value, options=[], types=[]) {
    this.types=types
    this.label=label
    this.value=value
    this.options=options
  }
  static get DATE() {
    const item = new TableDataType('日期类型', 'date', dateFormatOptions, [ 'field' ])
    return item
  }
  static get STRING() {
    const item = new TableDataType('字符类型', 'string', stringFormatOptions, [ 'param' ])
    return item
  }
  static get NUMBER() {
    const item = new TableDataType('数值类型', 'number', numberFormatOptions, [ 'field', 'param' ])
    return item
  }
  static get ACCOUNT() {
    const item = new TableDataType('账号类型', 'account', accountFormatOptions, [ 'field' ])
    return item
  }

  /**
   * 比对相同
   * 
   * @param {String|TableDataType} param 
   * @returns {Boolean} 
   */
  equals (param) {
    if (param instanceof TableDataType) {
      return param.value === this.value
    } else {
      return param === this.value
    }
  }
  /**
   * 获取数据 
   * 
   * @param {String} type 类型
   * @returns 
   */
  getData (type) {
    return type ? TableDataType[type.toUpperCase()] : this
  }

  /**
   * 是否包含 格式化规则
   * @param {String} format 
   * @returns 
   */
  includeFormat (format) {
    return this.options.find(item => item.value === format) ? true : false
  }
  /**
   * 获取数据类型下的规则对象
   * 
   * @param {String} format 格式化规则
   * @returns 
   */
  getFormatItem (format) {
    return this.options.find(item => item.value === format)
  }
}

/**
 * 格式化分类的集合类
 */
export class TableDataTypes {
  /**
   * 获取格式化分类的集合数据
   * 
   * @returns {Array} 格式化类型的集合数据
   */
  static getData (type) {
    const staticKeys = PojoUtils.getOwnPropertyStatics(TableDataType)
    const staticItems = []
    staticKeys.forEach(key => {
      const item = TableDataType[key]
      if (type) {
        if (item.types.includes(type)) staticItems.push(item)
      } else {
        staticItems.push(item)
      }
    })
    return staticItems
  }
  /**
   * 是否包含指定的分类信息
   * 
   * @param {String|TableDataType} kind 分类信息
   * @returns 
   */
  static includes (kind) {
    const staticKeys = PojoUtils.getOwnPropertyStatics(TableDataType)
    if (!kind) return false
    if (kind instanceof TableDataType) {
      if (!kind.value) return false
      return staticKeys.includes(kind.value.toUpperCase())
    } else {
      return staticKeys.includes(kind.toUpperCase())
    }
  }
}
